package com.axc.gallery2.net;

import java.util.concurrent.Executor;
import java.util.concurrent.Executors;

import android.content.Context;
import android.os.Bundle;

import com.renren.api.connect.android.Renren;
import com.renren.api.connect.android.RequestListener;
import com.renren.api.connect.android.Util;
import com.renren.api.connect.android.common.AbstractRequestListener;
import com.renren.api.connect.android.exception.RenrenError;
import com.renren.api.connect.android.photos.PhotoUploadRequestParam;
import com.renren.api.connect.android.photos.PhotoUploadResponseBean;

/**
 * 对人人的相册请求封装成异步。注意：使用该类调用人人接口时，不能在Listener中直接更新UI控件。
 * 
 * @see Renren
 * @see RequestListener
 * 
 */

public class AsyncDownPhotos {
    private Renren renren;
    
    private Context context;

    private Executor pool;

    public AsyncDownPhotos(Renren renren,Context context) {
        this.renren = renren;
        this.pool = Executors.newFixedThreadPool(2);
        this.context = context;
    }
    
    /**
     * 调用 人人 APIs，服务器的响应是JSON串。
     * 
     * 人人 APIs 详细信息见 http://wiki.dev.renren.com/wiki/API
     * 
     * @param parameters 注意监听器中不在主线程中执行，所以不能在监听器中直接更新UI代码。
     * @param listener
     */
    public void requestJSON(Bundle parameters, RequestListener listener) {
        request(parameters, listener, Renren.RESPONSE_FORMAT_JSON);
    }
    
    /**
     * 调用 人人 APIs。
     * 
     * 人人 APIs 详细信息见 http://wiki.dev.renren.com/wiki/API
     * 
     * @param parameters
     * @param listener 注意监听器中不在主线程中执行，所以不能在监听器中直接更新UI代码。
     * @param format return data format (json or xml)
     */
    private void request(final Bundle parameters, final RequestListener listener,
            final String format) {
        pool.execute(new Runnable() {

            @Override
            public void run() {

                try {
                    String resp = "";
                    if ("xml".equalsIgnoreCase(format)) {
                        resp = renren.requestXML(parameters);
                    } else {
                        resp = renren.requestJSON(parameters);
                    }
                    RenrenError rrError = Util.parseRenrenError(resp, format);
                    if (rrError != null) {
                        listener.onRenrenError(rrError);
                    } else {
                        listener.onComplete(resp);
                    }
                } catch (Throwable e) {
                    listener.onFault(e);
                }
            }
        });
    }
    
    /**
     * 获取相册图片的异步接口
     * 
     * @param bundle 
     *          调用此接口需准备的参数
     * @param listener
     *            对返回结果进行操作
     *            
     *            <p>详情请参考 http://wiki.dev.renren.com/wiki/Photos.get
     * 
     */
    public void getPhotos(PhotosGetRequestParam photosGetRequestParam,
            AbstractRequestListener<PhotosGetResponseBean> listener) {
        new PhotosGetHelper(renren,context).asyncGetPhotos(photosGetRequestParam, listener);
    }
    
    
	
	/**
	 * 上传照片的异步接口
	 * 
	 * @param photo
	 * 			调用此接口需准备的参数
	 * @param listener
	 *            开发者实现，对返回结果进行操作
	 * 
	 * 			  <p>详情请参考 http://wiki.dev.renren.com/wiki/Photos.upload
	 */
	public void publishPhoto(PhotoUploadRequestParam photo,
			AbstractRequestListener<PhotoUploadResponseBean> listener) {
		new PhotosGetHelper(renren,context).asyncUploadPhoto(photo, listener);
	}

}
